package com.myapp.db.entity;

import java.nio.ByteBuffer;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.atomic.*;

import com.myapp.data.define.BaseBean;
import com.myapp.db.config.ann.TableDefine;
import com.myapp.db.config.define.UpdateData;
import com.myapp.db.dao.manual.UserDao;

/**
 * 文件名：UserEntity.java
 * <p>
 * 功能：地图信息表
 * <p>
 * 作者：Builded by AppTools.
 */
@TableDefine(name = "User", dao = UserDao.class)
public class UserEntity extends BaseBean {
	// 用户id
	private AtomicLong userid = new AtomicLong(0);
	
	// passportid
	private String passportid = null;
	
	// 是否可用（0:正常，1:各种异常）
	private AtomicInteger isactive = new AtomicInteger(0);
	
	// 此条记录最后修改时间
	private AtomicLong updatetime = new AtomicLong(0);
	

	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public long getUserid() {
		return this.userid.get();
	}

	/**
	 * 原子增加用户id
	 * 
	 * @param userid 要加的值（正数）
	 */
	public void addUserid(long userid) {
		UpdateData data = new UpdateData(this.userid.get(), userid);
		this.getOldData().put("userid", data);
		this.userid.addAndGet(userid);
	}

	/**
	 * 原子减少用户id
	 * 
	 * @param userid 要减的值（正数）
	 */
	public void minusUserid(long userid) {
		UpdateData data = new UpdateData(this.userid.get(), userid);
		this.getOldData().put("userid", data);
		this.userid.addAndGet(userid*-1);
	}
	
	/**
	 * 直接设置userid的值
	 * 
	 * @param userid 要设置的新值
	 */
	public void setUserid(long userid){
		UpdateData data = new UpdateData(this.userid.get(), userid);
		this.getOldData().put("userid", data);
		this.userid.set(userid);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public String getPassportid() {
		return this.passportid;
	}

	/**
	 * 直接设置passportid的值
	 * 
	 * @param passportid 要设置的新值
	 */
	public void setPassportid(String passportid) {
		if(this.passportid == null){
			UpdateData data = new UpdateData("", passportid);
			this.getOldData().put("passportid", data);
		}else{
			UpdateData data = new UpdateData(this.passportid, passportid);
			this.getOldData().put("passportid", data);
		}
		this.passportid = passportid;
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public int getIsactive() {
		return isactive.get();
	}

	/**
	 * 原子增加是否可用（0:正常，1:各种异常）
	 * 
	 * @param isactive 要加的值（正数）
	 */
	public void addIsactive(int isactive) {
		UpdateData data = new UpdateData(this.isactive.get(), isactive);
		this.getOldData().put("isactive", data);
		this.isactive.addAndGet(isactive);
	}
	
	/**
	 * 原子减少是否可用（0:正常，1:各种异常）
	 * 
	 * @param isactive 要减的值（正数）
	 */
	public void minusIsactive(int isactive) {
		UpdateData data = new UpdateData(this.isactive.get(), isactive);
		this.getOldData().put("isactive", data);
		this.isactive.addAndGet(isactive*-1);
	}
	
	/**
	 * 直接设置isactive的值
	 * 
	 * @param isactive 要设置的新值
	 */
	public void setIsactive(int isactive){
		UpdateData data = new UpdateData(this.isactive.get(), isactive);
		this.getOldData().put("isactive", data);
		this.isactive.set(isactive);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public long getUpdatetime() {
		return this.updatetime.get();
	}

	/**
	 * 原子增加此条记录最后修改时间
	 * 
	 * @param updatetime 要加的值（正数）
	 */
	public void addUpdatetime(long updatetime) {
		UpdateData data = new UpdateData(this.updatetime.get(), updatetime);
		this.getOldData().put("updatetime", data);
		this.updatetime.addAndGet(updatetime);
	}

	/**
	 * 原子减少此条记录最后修改时间
	 * 
	 * @param updatetime 要减的值（正数）
	 */
	public void minusUpdatetime(long updatetime) {
		UpdateData data = new UpdateData(this.updatetime.get(), updatetime);
		this.getOldData().put("updatetime", data);
		this.updatetime.addAndGet(updatetime*-1);
	}
	
	/**
	 * 直接设置updatetime的值
	 * 
	 * @param updatetime 要设置的新值
	 */
	public void setUpdatetime(long updatetime){
		UpdateData data = new UpdateData(this.updatetime.get(), updatetime);
		this.getOldData().put("updatetime", data);
		this.updatetime.set(updatetime);
	}
	

	@Override
	public void parseEntity(ResultSet rest) throws SQLException {
		// id
		this.setId(rest.getLong(1));
		// 用户id
		this.userid.set(rest.getLong(2));
		// passportid
		String tmp = rest.getString(3);
		if (!"null".equals(tmp)) {
			this.passportid = tmp;
		}
		// 是否可用（0:正常，1:各种异常）
		this.isactive.set(rest.getInt(4));
		// 此条记录最后修改时间
		this.updatetime.set(rest.getLong(5));
	}
	
	
	/**
	 * 将本对象变化的数据序列化
	 * 
	 * @return 返回序列化后的数据
	 */
	@Override
	public byte[] serialization() {
	ByteBuffer data = ByteBuffer.allocate(1024);
		if (this.getOldData().containsKey("userid")) {
			data = this.checkCapacity(data, 8);
			data.put((byte) 0);
			data.putLong(userid.get());
		}
		if (this.getOldData().containsKey("passportid")) {
			byte[] tmp=passportid.getBytes();
			data = this.checkCapacity(data, tmp.length);
			data.put((byte) 1);
			data.putInt(tmp.length);
			data.put(tmp);
		}
		if (this.getOldData().containsKey("isactive")) {
			data = this.checkCapacity(data, 4);
			data.put((byte) 2);
			data.putInt(isactive.get());
		}
		if (this.getOldData().containsKey("updatetime")) {
			data = this.checkCapacity(data, 8);
			data.put((byte) 3);
			data.putLong(updatetime.get());
		}
		data.flip();
		return data.array();
	}
	
	
	/**
	 * 反序列化
	 * 
	 * @param data 要反序列化的数据
	 * 
	 * @return 返回序列化出来的对象
	 */
	@SuppressWarnings("unchecked")
	@Override
	public UserEntity unSerialization(byte[] data) {
		UserEntity userEntity = new UserEntity();
		if (data.length > 0) {

			ByteBuffer buffer = ByteBuffer.wrap(data);
			buffer.flip();

			byte type = 0;
			while (buffer.position() < buffer.limit()) {
				type = buffer.get();
			if (type ==  0) {
				this.setUserid(buffer.getLong());
			}
			
			if (type ==  1) {
				int length=buffer.getInt();
				byte[] tmp=new byte[length];
				buffer.get(tmp);
				this.setPassportid(new String(tmp));
			}
			
			if (type ==  2) {
				this.setIsactive(buffer.getInt());
			}
			
			if (type ==  3) {
				this.setUpdatetime(buffer.getLong());
			}
			
			}
		}

		return userEntity;
	}
}
